package org.sundatagroup.aurora.show.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.sundatagroup.aurora.core.service.querier.IQuerier;
import org.sundatagroup.aurora.show.dao.AssetDao;
import org.sundatagroup.aurora.show.entity.asset.Asset;
import org.sundatagroup.aurora.show.entity.model.AssetModel;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

/**
 * <p>封装 {@link Asset} 相关操作的服务层, 用于查询、创建、封装资源
 * </p>
 * 
 * @version 0.2.0
 * <br>补充通用查询接口
 * 
 * @author CharlesChen
 * @author Zdream
 * @date 2018-06-01
 * @since 0.1.1
 */
@Service
public class AssetService implements IQuerier {
    @Autowired
    AssetDao assetDao;

    /**
     * 增操作：增加一个{@link Asset}
     * @param a
     * @throws IllegalArgumentException Asset参数错误
     * @return
     */
    public boolean add(Asset a) {
        if (a == null || !a.isValid()) {
            return false;
        }
        AssetModel am = a.toModel();
        assetDao.add(am);

        return true;
    }

    /**
     * 查操作：根据{@link Asset}的name和type查询。
     * @param name
     * @param type
     * @return
     */
    public Asset queryByNameAndType(String name, String type) {
        AssetModel am = assetDao.findByNameAndType(name, type);

        return am == null ? null : Asset.fromModel(am);
    }

    /**
     * 查操作：统计所有的{@link AssetModel}数量
     * @return
     */
    public int countAsset() {
        return assetDao.count();
    }

	@Override
	public String[] types() {
		return new String[] {"/query/asset"};
	}

	/**
	 * 允许 <code>"/query/asset"</code> 查询数据, 按 name 和 type 进行查询
	 */
	@Override
	public JsonElement query(String type, JsonElement key) {
		if (key.isJsonObject()) {
			JsonObject ko = key.getAsJsonObject();
			Asset a = this.queryByNameAndType(
					ko.get("name").getAsString(), ko.get("type").getAsString());
			if (a != null) {
				return a.toJson();
			}
		}
		
		return null;
	}
}
